import scrapy
from ershouche.items import ErshoucheItem

class CarSpider(scrapy.Spider):
    #爬虫的名字为ershouche
    name = 'ershouche'
    
    #允许的域名地址(二手车之家)
    allowed_domains = ['www.che168.com']
    
    #所爬取网页的url地址，二手车之家网站北京地区
    start_urls = ["https://www.che168.com/beijing/a0_0msdgscncgpi1lto8cspexx0/"]


    #进行数据解析，使用xpath方法进行解析
    def parse(self, response):
        
        # 获取当前页面的所有二手车列表项信息(因为每个车的信息都在ul下的li标签里)
        car_list = response.xpath("//ul[@class='viewlist_ul']/li")
        
        for li in car_list:  # 遍历当前页二手车列表信息
        
        #对brand，price，mileage用xpath进行解析，extract_first()返回的是一个字符串，是list数组里面的第一个字符串
            # 所爬取的内容————品牌
            brand = li.xpath(".//div[@class='cards-bottom']/h4/text()").extract_first()  # 提取品牌数据
            # 如果爬取不到品牌（例如当前li是一个广告），则进行下一次循环,因为页面中存在广告，所爬取的内容不一定都是所想要的数据
            if brand is None:  
                continue    #当遇到数据为页面的广告时结束当前循环，进行下一次的循环爬取

            brand = brand.split(" ")[0].split(" ")[0]  # 品牌

            #价格，即当前二手车的售卖价格
            price = li.xpath(".//div[@class='cards-price-box']/span/em/text()").extract_first()# 价格
            
            # 当前汽车的em标签，获取二手车的首付价格和相关标签
            information = li.xpath(".//div[@class='cards-bottom']/p/text()").extract_first().split("/")[0]

            # 用于接收一个二手车的数据
            item = ErshoucheItem()  
            # 填充数据到Item
            item["brand"] = brand
            item["price"] = price
            item["information"] =information
        
            yield item   # 交给Item Pipeline处理
            #yield保存当前运行状态，然后暂停执行，即将函数挂起，等待下一次向url地址发送请求并解析
        
        
            # xpath解析找到“下一页”按钮的URL地址,返回的是一个列表
            next_url = response.xpath("//div[@class='content fn-clear card-wrap']/div[@class='page fn-clear']/a[last()]/@href").extract_first()
            
            # 最后一页“按钮”的url地址为javascript:;如果不是最后一页，则继续发送请求
            if next_url != "javascript:;": 
                
                # 获得的网页进行字符串的拼接，补充完整下一页的URL
                nextpage_url = "https://www.che168.com" + str(next_url)  
            
            #如果已经是最后最后一页的url地址，则直接结束循环
            else:
                break
            # 向下一页发送请求获取响应，并设置回调函数为parse方法，因为下一页的解析方法与当前页相同
            yield scrapy.Request(
                nextpage_url,
                callback=self.parse,
                dont_filter=True    
                )
